<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>模块</title>
  <style>
    div, p, li {
      line-height: 40px
    }
    span {
      color: red
    }
  </style>
</head>
<body>
  <p>“内部模块”称为<span>命名空间</span>，“外部模块”简称为<span>模块</span></p>
  <ul>
    <li>模块在自身作用域里执行，而不是在全局作用域里。</li>
    <li>模块之间的关系是通过在文件级别上使用imports和exports建立的</li>
    <li>模块使用模块加载器加载其他模块。在运行时，模块加载器的作用是在执行此模块代码前去查找并执行这个模块的所有依赖</li>
    <li>
      大家熟知的Javascript模块加载器是服务于Node.js的<span>CommonJS</span>和服务于Web应用的<span>Require.js</span>
    </li>
    <li>
      TypeScript与ECMAScript 2015一样，任何包含顶级import或者export的文件都被当成一个模块
    </li>
    <li>
        相反地，如果一个文件不带有顶级的import或者export声明，那么它的内容被视为全局可见的
    </li>
  </ul>
  
  <h3>导出</h3>
  <ul>
    <li>任何声明（比如变量，函数，类，类型别名或者接口）都能够通过添加export关键字来导出</li>
    <li>浏览器不支持 commonJS语法，测试 TS 文件的时候用 node 测试</li>
    <li></li>
  </ul>
  <h2>实战指南</h2>
  <ul>
    <li>导出声明：即export一个声明；导出语句：即导出一个语句，比如：对象</li>
    <li>重新导出：我们经常去扩展其他模块，并且只导出那个模块的部分内容。<span>重新导出功能并不会在当前模块导入那个模块或定义一个新的全局变量</span></li>
    <li>或者一个模块可以包裹多个模块，并将其带出的内容联合在一起，使用export * from 'module'</li>
    <li>
      使用import关键字导入其他模块中的导出内容
    </li>
    <li>
      标记为默认导出的类和函数的名字是可以省略的
    </li>
    <li>
      根据编译时指定的模块目标参数，编译器会生成相应的代码。供Node.js（commonJS），Require.JS(AMD)。为了编译，我们必须在命令行上指定一个模块目标。对于Nodejs来说，使用--module commonjs.  tsc --module commonjs Test.ts,编译完成后，每个模块会生成一个单独的.js文件
    </li>
    <li>
      在nodejs里，大部分工作是加载一个或多个模块。我们可以使用顶级的export声明来为每个模块都定义一个.d.ts文件。但最好还是写在一个大的.d.ts文件里，然后使用import操作
    </li>
    <li>
      如果你不想在使用一个新模块之前花时间去编写声明，可以采用声明的简写形式以便能够快速使用它。简写模块里所有导出类型将时any
    </li>
  </ul>
</body>
</html>